﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using OpenSource.UPnP;
using System.Xml;
using System.Windows.Markup;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Windows.Threading;
using System.Runtime.CompilerServices;
using System.Collections;


namespace DispositifAffichage
{


    /**
 * \file          MainWindow.xaml.cs
 * \author        sbai
 * \brief         Interaction logic pour MainWindow.xaml.
 *
 * \details       Cette classe définit les méthodes de l'interface graphique utilisateur "MainWindow.xaml".
 */


    public partial class MainWindow : Window
    {


        public MainWindow()
        {
            InitializeComponent();
            l = new DispositifAffichage.ServeurDispositifAffichage(this);
        }

        DispositifAffichage.ServeurDispositifAffichage l;



        /**
      * \createinterface    creer une instance de la class "GenerateInterface2" qui va creer l'interface demandée selon le fichier de descrption reçu.
      * \param    chaine: le fichier de description sous forme d'une chaine de caractères.
      */

        public void createinterface(string chaine, string nom)
        {

            Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)delegate()
            {

                GenerateInterface2 p = new GenerateInterface2(chaine, nom, this);

                p.chargement_UI();

            });

        }


        /**
       * \updateInterface   pour mettre à jour l'interface graphique.
       * \param    component: le nom du composant.
       * \param    propriete: le propriete du composant.
       * \param    valeur: la valeur à mettre à jour.
       * \param    yy: instance de la class GenerateInterface2 liée au interface à afficher (pour récupérer l'interface 
        * qu'on a générer j'ai passé comme parametre de la methode l'instance propre à cette interface).
    */

        public void updateInterface(string component, string propriete, string valeur, GenerateInterface2 yy)
        {

            Console.WriteLine("la methode updateInterface est appelée ???????????????????????????????");
            Console.WriteLine("la propriétééééééééééé esttt " + propriete + " la propriétééééééééééé esttt");

            Console.WriteLine("le component esttt " + component + " le component esttt");

            Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)delegate()
            {

                if (yy.X == null) { Console.WriteLine("NULLLLLLLLLLLLLLLLLLLLLLLLL"); }

                var element = yy.X.FindName(component);

                if (element != null) { Console.WriteLine("j'ai trouvé l'element"); }


                PropertyInfo[] list5;


                if (propriete.Contains(" "))
                {
                    propriete = propriete.Trim();
                }

                if (element != null)
                {
                    Console.WriteLine("trueeeeeeeeeeeeeeeeeeeeeee");

                    if (element.GetType() == typeof(Image))
                    {

                        Console.WriteLine("Ouiiiiiiiiii c'est une imaaaaaaaaaaaaaaageeeeeeeeeeeeeeeeee");

                        Image im11 = (Image)element;


                        Binding tmpBinding = new Binding();
                        string d = valeur;
                        tmpBinding.Source = new Uri(@d, UriKind.Absolute);

                        im11.SetBinding(Image.SourceProperty, tmpBinding);
                    }


                    else
                    {
                        Console.WriteLine("Nonnnnnnnnnnn ce n'est pas une imaaaaaaaaaaaaaaageeeeeeeeeeeeeeeeee");
                        list5 = element.GetType().GetProperties();

                        Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");

                        for (int f = 0; f < list5.Length; f++)
                        {
                            string propertyy = list5[f].Name;

                            if (propertyy == propriete)
                            {
                                Console.WriteLine(propertyy);

                                var prop = element.GetType().GetProperty(propertyy).GetValue(element, null);

                                Console.WriteLine("PRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR " + prop);

                                try
                                {
                                    element.GetType().GetProperty(propertyy).SetValue(element, valeur, null);
                                }


                                catch (ArgumentException ex)
                                {
                                    Console.WriteLine("Exception:");
                                    Console.WriteLine("Il y a une erreur, plus d'informations ci-dessous :");

                                    Console.WriteLine();
                                    Console.WriteLine("Message d'erreur : " + ex.Message);

                                    Console.WriteLine();
                                    Console.WriteLine("Type de l'exception : " + ex.GetType());
                                    try
                                    {
                                        int val = int.Parse(valeur);

                                        Console.WriteLine("valllllllllllllllllllllllll   :   " + val);
                                        element.GetType().GetProperty(propertyy).SetValue(element, val, null);
                                    }
                                    catch (ArgumentException ex1)
                                    {
                                        Console.WriteLine("Exception:");
                                        Console.WriteLine("Il y a une erreur, plus d'informations ci-dessous :");

                                        Console.WriteLine();
                                        Console.WriteLine("Message d'erreur : " + ex1.Message);

                                        Console.WriteLine();
                                        Console.WriteLine("Type de l'exception : " + ex1.GetType());



                                    }

                                }
                                catch (Exception ex)
                                {

                                    Console.WriteLine("Exception:");
                                    Console.WriteLine("Il y a une erreur, plus d'informations ci-dessous :");

                                    Console.WriteLine();
                                    Console.WriteLine("Message d'erreur : " + ex.Message);

                                    Console.WriteLine();
                                    Console.WriteLine("Type de l'exception : " + ex.GetType());
                                }




                            }

                        }

                        Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");

                    }
                }


                else
                {

                    Console.WriteLine("falseeeeeeeeeeeeeeeeee");
                }


            });

        }
        







        /**
        * \ButtonCloseClicked      méthode pour arrêter le device UPnP.
        * \param    sender         Le déclencheur de l'évènement.
        * \param    e              l'évènement icic est un Click sur le button.
        
        */
     
      private void ButtonCloseClicked(object sender, RoutedEventArgs e)
        {
            l.stopUPnP();

        }
                /**
        * \button3_Click           méthode pour démarrer le device UPnP.
        * \param    sender         Le déclencheur de l'évènement.
        * \param    e              l'évènement ici est un Click sur le button.
        
        */
        private void button3_Click(object sender, RoutedEventArgs e)
        {
            l.startUPnP();
            RefreshMessage("le Device 'DispositifAffichage1' est connecté");

        }

        /**
       * \button1_Click           méthode pour fermer l'interface MainWindow.
       * \param    sender         Le déclencheur de l'évènement.
       * \param    e              l'évènement icic est un Click sur le button.
        
       */
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            l.stopUPnP();
            this.Close();
        }

        /**
       * \RefreshMessage           méthode pour mettre à jour les messages affichés dans l'interface du dispositif d'affichage.
       * \param    message         Le message à afficher.
       */
        private void RefreshMessage(string message)
        {
            Mes.Text = message;
            Mes.Refresh();
        }



              

    }


    public static class ExtensionMethods
    {
        private static Action EmptyDelegate = delegate() { };

        public static void Refresh(this UIElement uiElement)
        {
            uiElement.Dispatcher.Invoke(EmptyDelegate, System.Windows.Threading.DispatcherPriority.Render);
        }
    }

}







